#!/usr/bin/env python3
"""
SDL MCP Server

面向 SDL (Simple DirectMedia Layer) 多媒体库的命令行操作 MCP 服务器。

MCP tools 列表：
1. sdl_check_installation - 检查 SDL 库是否已安装
   参数：无
   返回：包含安装检查结果的 JSON

2. sdl_compile_test - 编译 SDL 测试程序
   参数：source_file (str): 源代码文件路径
         output_file (str): 输出可执行文件路径
   返回：包含编译结果的 JSON

3. sdl_run_test - 运行 SDL 测试程序并验证输出
   参数：executable (str): 可执行文件路径
         output_file (str): 输出文件路径
         expected_text (str): 期望在输出中出现的文本
   返回：包含运行结果的 JSON
"""

import subprocess
import json
from typing import Optional
from mcp.server.fastmcp import FastMCP, Context

mcp = FastMCP("SDL MCP Server")

@mcp.tool()
def sdl_check_installation() -> dict:
    """
    检查 SDL 库是否已安装
    
    返回：
        dict: 包含以下字段的 JSON 对象：
            - success: 操作是否成功
            - command: 执行的命令
            - exit_code: 命令退出码
            - stdout: 标准输出内容
            - stderr: 标准错误内容
    """
    command = ["rpm", "-qa", "|", "grep", "SDL"]
    try:
        result = subprocess.run(
            "rpm -qa | grep SDL",
            shell=True,
            capture_output=True,
            text=True,
            timeout=30
        )
        return {
            "success": result.returncode == 0,
            "command": "rpm -qa | grep SDL",
            "exit_code": result.returncode,
            "stdout": result.stdout,
            "stderr": result.stderr
        }
    except Exception as e:
        return {
            "success": False,
            "command": "rpm -qa | grep SDL",
            "exit_code": -1,
            "stdout": "",
            "stderr": str(e)
        }

@mcp.tool()
def sdl_compile_test(source_file: str, output_file: str) -> dict:
    """
    编译 SDL 测试程序
    
    参数：
        source_file (str): 源代码文件路径
        output_file (str): 输出可执行文件路径
        
    返回：
        dict: 包含以下字段的 JSON 对象：
            - success: 操作是否成功
            - command: 执行的命令
            - exit_code: 命令退出码
            - stdout: 标准输出内容
            - stderr: 标准错误内容
    """
    command = f"gcc {source_file} -o {output_file} -lSDL -lSDLmain"
    try:
        result = subprocess.run(
            command,
            shell=True,
            capture_output=True,
            text=True,
            timeout=60
        )
        return {
            "success": result.returncode == 0,
            "command": command,
            "exit_code": result.returncode,
            "stdout": result.stdout,
            "stderr": result.stderr
        }
    except Exception as e:
        return {
            "success": False,
            "command": command,
            "exit_code": -1,
            "stdout": "",
            "stderr": str(e)
        }

@mcp.tool()
def sdl_run_test(executable: str, output_file: str, expected_text: str) -> dict:
    """
    运行 SDL 测试程序并验证输出
    
    参数：
        executable (str): 可执行文件路径
        output_file (str): 输出文件路径
        expected_text (str): 期望在输出中出现的文本
        
    返回：
        dict: 包含以下字段的 JSON 对象：
            - success: 操作是否成功
            - command: 执行的命令
            - exit_code: 命令退出码
            - stdout: 标准输出内容
            - stderr: 标准错误内容
    """
    # 运行测试程序
    run_command = f"{executable} > {output_file}"
    try:
        run_result = subprocess.run(
            run_command,
            shell=True,
            capture_output=True,
            text=True,
            timeout=30
        )
        
        # 检查输出文件是否存在并验证内容
        if run_result.returncode == 0:
            grep_command = f"grep \"{expected_text}\" {output_file}"
            grep_result = subprocess.run(
                grep_command,
                shell=True,
                capture_output=True,
                text=True,
                timeout=30
            )
            
            return {
                "success": grep_result.returncode == 0,
                "command": f"{run_command} && {grep_command}",
                "exit_code": grep_result.returncode,
                "stdout": f"Run stdout: {run_result.stdout}\nGrep stdout: {grep_result.stdout}",
                "stderr": f"Run stderr: {run_result.stderr}\nGrep stderr: {grep_result.stderr}"
            }
        else:
            return {
                "success": False,
                "command": run_command,
                "exit_code": run_result.returncode,
                "stdout": run_result.stdout,
                "stderr": run_result.stderr
            }
            
    except Exception as e:
        return {
            "success": False,
            "command": run_command,
            "exit_code": -1,
            "stdout": "",
            "stderr": str(e)
        }

if __name__ == "__main__":
    mcp.run()